package com.yangwudi.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

//<----------------------------------该部分为练习内容，与项目无关，可直接删除----------------------------------->

@Slf4j
//@Aspect
@Component
public class MyAspect1 {
    //切入点表达式
    @Pointcut("execution(* com.yangwudi.service.impl.*.*(..))")
    private void pt(){};
    //    通知类型

    // 1.前置通知 - 目标方法运行之前运行
    @Before("pt()")
    public void before(){
        log.info("before ....");
    }

    //2.环绕通知 - 目标方法运行之前和运行之后都运行 - 重点！！！
    @Around("pt()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable{
        log.info("around before ....");
        Object obj = pjp.proceed();
        log.info("around after ....");
        return obj;
    }

    //3.后置通知 - 目标方法运行之后运行,无论是否异常都运行
    @After("pt()")
    public void after(){
        log.info("after ....");
    }

    //4.返回后置通知 - 目标方法正常返回后运行，如果方法抛异常则不运行
    @AfterReturning("pt()")
    public void afterReturning(){
        log.info("afterReturning ....");
    }

    //5.异常后通知 - 运行目标方法异常后运行，如果方法正常返回则不运行
    @AfterThrowing("pt()")
    public void afterThrowing(){
        log.info("afterThrowing ....");
    }
}
